﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using System.Collections.Specialized;
using System.Collections.ObjectModel;

namespace Sinacor.Infra.Common
{
    /// <summary>
    /// Disponibiliza métodos de auxíliar o manuseio de coleções.
    /// </summary>
    public class CollectionHelper
    {
        /// <summary>
        /// Construtor padrão
        /// </summary>
        protected CollectionHelper()
        { 
        }

        /// <summary>
        /// Indica se duas coleções são iguais
        /// </summary>
        /// <param name="a">Primeira coleção</param>
        /// <param name="b">Segunda coleção</param>
        /// <returns>true se coleções forem iguais, false se não forem</returns>
        public static bool CollectionsEquals(IList a, IList b)
        {
            foreach (object item in a)
            {
                if (!b.Contains(item))
                    return false;
            }

            foreach (object item in b)
            {
                if (!a.Contains(item))
                    return false;
            }

            return true;
        }

        /// <summary>
        /// Sincroniza um item alterado em uma coleção em outra coleção
        /// </summary>
        /// <param name="collection">Coleção a ser sincronizada</param>
        /// <param name="action">Ação realizada no item</param>
        /// <param name="newIndex">Índice do item incluído</param>
        /// <param name="oldIndex">Índice do item excluído</param>
        /// <param name="newItem">Item incluído</param>
        /// <param name="oldItem">Item excluído</param>
        public static void SynchronizeCollection(IList collection,
                                                 NotifyCollectionChangedAction action,
                                                 int newIndex,
                                                 int oldIndex,
                                                 object newItem,
                                                 object oldItem)
        {
            switch (action)
            {
                case NotifyCollectionChangedAction.Add:
                    if (collection.Count == newIndex)
                        collection.Add(newItem);
                    else
                        collection.Insert(newIndex, newItem);
                    break;

                case NotifyCollectionChangedAction.Move:
                    ((ObservableCollection<object>)collection).Move(oldIndex, newIndex);
                    break;

                case NotifyCollectionChangedAction.Remove:
                    collection.RemoveAt(oldIndex);
                    break;

                case NotifyCollectionChangedAction.Replace:
                    collection[newIndex] = newItem;
                    break;

                case NotifyCollectionChangedAction.Reset:
                    collection.Clear();
                    break;
            }
        }
    }
}
